package com.kingsoft.demo.core.oo;

/**
	Father类，用于被Son类继承
*/
class Father{
	//非静态属性arg_F
	public String arg_F = Util.initArg("Father");
	//静态属性argStatic_F
	public static String argStatic_F = Util.initStaticArg("Father");
	
	/**
		Father类的构造器，仅打印调用该构造器的简单信息。
	*/
	public Father(){
		System.out.println("调用Father类的构造器Father()");	
	}
	
	/**
		Father类的静态方法，仅打印调用该静态方法的简单信息。
	*/
	public static void methodStatic(){
		System.out.println("调用Father类的静态方法methodStatic");	
	}
	
	/**
		Father类的非静态方法，仅打印调用该非静态方法的简单信息。
	*/
	public void methodUnStaic(){
		System.out.println("调用Father类的非静态方法methodUnStaic");	
	}
}

/**
	Son类，继承Father类，当然也继承Father类的所有属性和方法。
*/
class Son extends Father{
	//非静态属性arg_S	
	public String arg_S = Util.initArg("Son");
	//静态属性argStatic_S
	public static String argStatic_S = Util.initStaticArg("Son");
	
	/**
		子类Son类的构造器，仅打印调用构造器的简单信息。
	*/
	public Son(){
		System.out.println("调用Son类的构造器Son()");	
	}
	
	/**
		Son类的静态方法（覆盖掉父类的静态方法吗？），仅打印调用该静态方法的简单信息。
	*/
	public static void methodStatic(){
		System.out.println("调用Son类的静态方法methodStatic");	
	}
	
	/**
		Father类的非静态方法（覆盖掉父类的方法），仅打印调用该非静态方法的简单信息。
	*/
	public void methodUnStaic(){
		System.out.println("调用Son类的非静态方法methodUnStaic");	
	}
}

/**
	Util类作为一个工具集类，提供可供其他类中调用的静态方法。
*/
class Util{
	
	/**
		Util类的无参构造器。
	*/
	public Util(){
		System.out.println("调用Util类的构造器Util()");
	}
	
	/**
		方法initArg，读入一个String类型的对象，打印相关的调用信息，
		最后将该String类型的对象原样返回。用于初始化非静态变量。
	*/
	public static String initArg(String arg){
		System.out.println("初始化"+arg+"的非静态变量");
		return arg;
	}	
	
	/**
		方法initStaticArg，读入一个String类型的对象，打印相关的调用信息，
		最后将该String类型的对象原样返回。用于初始化静态变量。
	*/
	public static String initStaticArg(String arg){
		System.out.println("初始化"+arg+"的静态变量");	
		return arg;
	}
}


/**
	测试类TestStatic仅包含方法入口main。在其中包含有多个测试。
	但是在使用的过程中请保证每次只有一个测试块被调用，同时注释掉其他的测试块。
*/
public class TestStatic{
	
	public static void main(String[] args){
		
	/*	//测试1：仅测试新生成一个子类对象时的初始化顺序。
		Son s = new Son();
*/
		
	/*	//测试2：测试新生成多个子类对象时的初始化顺序。
		Son s1 = new Son();
		Son s2 = new Son();
	*/

/*		//测试3：测试不生成对象直接调用子类的，覆盖了父类的静态方法。
		Son.methodStatic();
*/

/*		//测试4：测试静态方法的“覆盖”
		Father f = new Son();
		f.methodStatic();      　　／／调用的是父类的静态方法
*/

		//测试5：测试非静态方法的“覆盖”
		Father f = new Son();
		f.methodUnStaic();           //调用的是子类的非静态方法
	
	}	
}